//导入数据库模块
const mysql = require('mysql');
const db = require('../db/index');
//使用bcrypt.js进行用户密码加密
const bcrypt = require('bcryptjs');
//导入crypto模块用于生成uuid
const crypto = require('crypto');
//导入fs模块用于文件及路径操作
const fs = require('fs');

/**
 * 上传头像文件处理函数
 * @param {Object} req - HTTP请求对象，包含上传的文件信息
 * @param {Object} res - HTTP响应对象，用于返回处理结果
 * @returns {void}
 */
exports.uploadAvatar = (req, res) => {
  // 检查是否有文件上传
  if (!req.files || req.files.length === 0) {
    return res.cc('请选择要上传的文件', 1);
  }
  // 确保上传目录存在
  const uploadDir = './public/upload';
  if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
  }
  //生成一个随机id唯一标识 
  const onlyId = crypto.randomUUID()
  let oldName = req.files[0].filename;
  // 将文件原始名称从latin1编码转换为utf8编码,并解决中文文件名乱码问题
  let newName = Buffer.from(req.files[0].originalname, 'latin1').toString('utf8')
  fs.renameSync('./public/upload/' + oldName, './public/upload/' + newName)
  // 将图片信息保存到数据库中
  //const sql = 'insert into image set ?'
  const sql = 'insert into image (image_url, onlyId) values (?, ?)';
  db.query(sql, {
    image_url: `http://localhost:3838/upload/${newName}`,
    onlyId
  }, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      onlyId,
      status: 0,
      url: 'http://localhost:3838/upload/' + newName
    })
  })
}
/**
 * 获取用户头像绑定账号
*/
exports.bindAccount = (req, res) => {
  const {
    account,
    url,
    onlyId
  } = req.body
  const sql = 'update image set account = ? where onlyId = ?'
  db.query(sql, [account, onlyId], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows == 1) {
      //使用update语句更新users表, 将指定用户的image_url字段设置为新值.
      //通过account字段作为条件定位要更新的用户记录.两个问号?是参数占位符，后续会用实际值替换
      const sql1 = 'update users set image_url = ? where account = ?'
      db.query(sql1, [url, account], (err, result) => {
        if (err) return res.cc(err)
        res.send({
          status: 0,
          message: '修改成功'
        })
      })
    }
  })
}

/**
 * 通过ID获取用户信息接收参数
*/
exports.getUserInfo = (req, res) => {
  const sql = 'select * from users where id = ?'
  db.query(sql, [req.body.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length !== 1) return res.cc('用户不存在')
    res.send(result)
  })
}
/**
 * 修改用户姓名 接收参数ID和name
*/
exports.changeName = (req, res) => {
  const {
    id,
    name
  } = req.body
  const sql = 'update users set name = ? where id = ?'
  db.query(sql, [name, id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows == 1) {
      res.send({
        status: 0,
        message: '修改成功'
      })
    }
  })
}
/**
 * 修改用户性别 接收参数ID和sex
*/
exports.changeSex = (req, res) => {
  const {
    id,
    sex
  } = req.body
  const sql = 'update users set sex = ? where id = ?'
  db.query(sql, [sex, id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows == 1) {
      res.send({
        status: 0,
        message: '修改成功'
      })
    }
  })
}
/**
 * 修改用户邮箱 接收参数ID和email
*/
exports.changeEmail = (req, res) => {
  const {
    id,
    email
  } = req.body
  const sql = 'update users set email = ? where id = ?'
  db.query(sql, [email, id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows == 1) {
      res.send({
        status: 0,
        message: '修改成功'
      })
    }
  })
}

/** 修改用户密码
  * @param {string} oldPassword - 旧密码，用于验证用户身份
  * @param {string} newPassword - 新密码，用于替换旧密码
  * @param {string} id - 用户ID，用于定位要修改密码的用户记录
  * */
exports.changePassword = (req, res) => {
  // 1. 根据用户ID查询用户信息
  const sql = 'select password from users where id = ?'
  db.query(sql, [req.body.id], (err, result) => {
    if (err) return res.cc(err)
    const compareResult = bcrypt.compareSync(req.body.oldPassword, result[0].password)
    if (!compareResult) {
      res.send({
        satus: 1,
        message: '旧密码错误'
      })
    }
    req.body.newPassword = bcrypt.hashSync(req.body.newPassword, 10)
    // 2. 更新数据库中的密码
    const sql1 = 'update users set password = ? where id = ?'
    db.query(sql1, [req.body.newPassword, req.body.id], (err, result) => {
      if (err) return res.cc(err)
      res.send({
        status: 0,
        message: '修改成功'
      })
    })
  })
}
/* 用户登录页面忘记密码 */
//验证账号与邮箱是否匹配 email,acount
exports.verifyAccountAndEmail = (req, res) => { 
  const {account,email} = req.body
  const sql = 'select email from users where account = ?'
 db.query(sql, [account], (err, result) => {
    if (err) return res.cc(err)
    // 添加结果检查
    if(result.length === 0) {
      return res.send({
        status: 1,
        message: '账号不存在'
      })
    }
    if(email === result[0].email ){
      res.send({
        status: 0,
        message: '查询成功'
      })
    }else{
      res.send({
        status: 1,
        message: '查询失败'
      })
    }
  }) 
}

//登录页面修改密码,核心参数newPassword，id
exports.changePasswordInLogin = (req, res) => {
  const user = req.body
  /*使用bcrypt库对用户提交的新密码进行哈希加密处理。
  bcrypt.hashSync()方法接收明文密码和salt轮数(10)作为参数，
  返回加密后的哈希值，并将结果赋值回请求体中的newPassword字段，从而实现密码的安全存储。
  */
  user.newPassword = bcrypt.hashSync(user.newPassword, 10)
  const sql = 'update users set password = ? where id = ?'
  db.query(sql,[user.newPassword, user.id], (err, result) => {
    if (err) return res.cc(err) 
      res.send({
        status: 0,
        message: '修改成功'
      })
  })
}